﻿
package wesi.Table;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;

/**
 * Created by IntelliJ IDEA.
 * User: nastya.kuz
 * Date: 29.07.2010
 * Time: 17:29:51
 * Расширение интерфейса стандартного класса javax.swing.table.JTableHeader
 * добавляет методы, облегчающие обращение к классу ColumnGroup
 */
public class GroupableTableHeader extends JTableHeader {
	private static final long serialVersionUID = 1L;
	private ArrayList<ColumnGroup> columnGroups;

	public GroupableTableHeader(TableColumnModel model) {
		super (model);
		setUI(new GroupableTableHeaderUI());
		setReorderingAllowed(false);
	}

	public void updateUI() {
		setUI(new GroupableTableHeaderUI());
	}

	/**
	 * Запрещается перестановка столбцов таблицы. независимо от параметра
	 *
	 * @param flag параметр
	 */
	public void setReorderingAllowed(boolean flag) {
		reorderingAllowed = false;
	}

	/**
	 * Добавляет переданную группу солбцов к таблице
	 *
	 * @param group Добавляемая группа
	 */
	public void addColumnGroup(ColumnGroup group) {
		if (columnGroups == null) {
			columnGroups = new ArrayList<ColumnGroup>();
		}
		columnGroups.add(group);
	}

	/**
	 * Определяет список групп в которых содержится столбец tableColumn
	 *
	 * @param tableColumn столбец
	 *
	 * @return Возвращает итератор для списка групп,
	 *         или null, если список групп пуст или столбца там нет
	 */
	@SuppressWarnings("rawtypes")
	public Iterator getColumnGroups(TableColumn tableColumn) {
		if (columnGroups != null) {
			for (ColumnGroup columnGroup : columnGroups) {
				//ищем группу, в которой находится данный столбец (проверяем все подгруппы columnGroup)
				List resultColumnGroup = columnGroup.getColumnGroups(
						tableColumn, new ArrayList<ColumnGroup>());
				if (resultColumnGroup != null) {
					return resultColumnGroup.iterator();
				}
			}
		}
		return null;
	}

	/**
	 * устанавливает расстояние между ячейками для текущей TableColumnModel
	 */
	public void setColumnMargin() {
		if (columnGroups == null) {
			return;
		}
		int columnMargin = getColumnModel().getColumnMargin();
		for (ColumnGroup columnGroup : columnGroups) {
			columnGroup.setColumnMargin(columnMargin);
		}
	}

}
